package hlock

import (
	"context"
	"fmt"
	"queue_demo/global"
	"time"
)

// 获取锁
// key: 锁的key
// val: 值
// expiration : 锁过期/秒
func Lock(key string, val string, expiration int) bool {

	var (
		client = global.RedisDB
		ctx    = context.Background()
		expire = time.Duration(expiration) * time.Second // 锁的超时时间
	)

	// 使用 SET 命令的 NX 选项来设置键，仅当键不存在时
	b, _ := client.SetNX(ctx, key, val, expire).Result()

	return b
}

// 释放锁
func UnLock(key string, val string) bool {

	var (
		client = global.RedisDB
		ctx    = context.Background()
		script = `if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end` // 使用 LUA 脚本来安全地释放锁，避免由于客户端宕机导致的解锁问题
	)

	i, _ := client.Eval(ctx, script, []string{key}, val).Result()
	return fmt.Sprint(i) == "1"
}
